Skip to content

Add status change topic#155

Open
kevinwallimann wants to merge 9 commits into
masterfrom
feature/151-add-status-change-topic
Open

Add status change topic#155
kevinwallimann wants to merge 9 commits into
masterfrom
feature/151-add-status-change-topic

Conversation

@kevinwallimann
Copy link
Copy Markdown

@kevinwallimann kevinwallimann commented May 20, 2026

Overview

See

Release Notes

  • Add status change topic

Related

Closes #151

Summary by CodeRabbit

  • New Features

    • Added a status-change event topic with a comprehensive validation schema for job lifecycle events, including required fields and conditional rules per event type.
  • Chores

    • Granted access for the new topic in access configuration.
    • Enabled discovery and listing of the new topic in configuration.
    • Updated local development test runner settings.
  • Tests

    • Updated unit tests to cover topic discovery and topics listing.

Review Change Stack

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 20, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: dc0a9a95-3713-4fb7-85ee-a6739841688d

📥 Commits

Reviewing files that changed from the base of the PR and between bd315a3 and f2d7278.

📒 Files selected for processing (5)
  • .vscode/settings.json
  • conf/access.json
  • conf/topic_schemas/status_change.json
  • tests/unit/handlers/test_handler_topic.py
  • tests/unit/utils/test_config_loader.py
✅ Files skipped from review due to trivial changes (1)
  • .vscode/settings.json
🚧 Files skipped from review as they are similar to previous changes (3)
  • conf/access.json
  • tests/unit/handlers/test_handler_topic.py
  • tests/unit/utils/test_config_loader.py

Walkthrough

Adds a new status_change topic: TOPIC_STATUS_CHANGE constant, a status_change JSON Schema with conditional event rules, an access control entry, config/handler wiring to discover and load the schema, and updated unit tests and editor settings.

Changes

Status Change Topic Support

Layer / File(s) Summary
Topic constant and schema definition
src/utils/constants.py, conf/topic_schemas/status_change.json, conf/access.json
Adds TOPIC_STATUS_CHANGE = "public.cps.za.status_change"; introduces status_change.json schema (event_type enum, identity/timing fields, nullable status_type with enums, and allOf conditional validation rules); registers public.cps.za.status_change in conf/access.json.
Handler and config loader integration
src/utils/config_loader.py, src/handlers/handler_topic.py
load_topic_names() maps status_change.json -> TOPIC_STATUS_CHANGE; HandlerTopic loads status_change.json into self.topics[TOPIC_STATUS_CHANGE] during schema initialization.
Test coverage and editor settings
tests/unit/handlers/test_handler_topic.py, tests/unit/utils/test_config_loader.py, .vscode/settings.json
Unit tests add the status_change.json fixture, update expected discovered topic counts, and assert public.cps.za.status_change appears in handler/topic listings; VSCode Python test settings updated for pytest.

Sequence Diagram

sequenceDiagram
  participant Client
  participant ConfigLoader as src/utils/config_loader.py
  participant TopicSchemaFile as conf/topic_schemas/status_change.json
  participant HandlerTopic as src/handlers/handler_topic.py
  participant AccessConfig as conf/access.json

  Client->>ConfigLoader: request discovered topics
  ConfigLoader->>TopicSchemaFile: read status_change.json
  ConfigLoader->>HandlerTopic: map filename -> TOPIC_STATUS_CHANGE
  HandlerTopic->>TopicSchemaFile: load parsed schema into self.topics[TOPIC_STATUS_CHANGE]
  HandlerTopic->>AccessConfig: consult access mapping for listing/authorization
  HandlerTopic->>Client: return topics list including public.cps.za.status_change
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Suggested labels

enhancement

Suggested reviewers

  • petr-pokorny-absa
  • oto-macenauer-absa

Poem

🐰 A tiny schema hops on by,
With constants neat and tests to try,
Access mapped and handlers tuned,
Status events now are attuned,
EventGate hums — a watchful sky.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 66.67% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed Title accurately summarizes the main change: adding a new status_change topic to the EventGate system.
Description check ✅ Passed Description includes overview with design doc links, release notes, and related issue closure, matching the required template structure.
Linked Issues check ✅ Passed All acceptance criteria from issue #151 are addressed: new status_change topic defined, JSON schema with required fields implemented, accessible via existing EventGate API endpoints.
Out of Scope Changes check ✅ Passed All changes directly support the status_change topic feature. VS Code settings update is a minor configuration adjustment unrelated to the feature but does not obstruct the PR objectives.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/151-add-status-change-topic

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (1)
tests/unit/handlers/test_handler_topic.py (1)

90-90: ⚡ Quick win

Add one POST-path test for public.cps.za.status-change schema validation.

Current additions validate discovery/listing only. A valid + invalid POST case for the new topic would protect the end-to-end contract (load + validate + reject bad payloads) from regressions.

Also applies to: 103-107, 117-117

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/unit/handlers/test_handler_topic.py` at line 90, Add a new test
function (e.g., test_post_status_change_schema_validation) in the existing
test_handler_topic suite that exercises the POST path for the schema named
"public.cps.za.status-change": send one valid POST payload (matching the schema,
e.g., including execution_id as string) and assert the handler accepts it
(status accepted/success), then send an obviously invalid payload (e.g.,
execution_id missing or wrong type) and assert the handler rejects it with a
validation error (400 or rejection response and an error message referencing the
schema/field); place both assertions in the same test to ensure load+validate
behavior is covered end-to-end.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@conf/topic_schemas/status_change.json`:
- Around line 20-33: The schema currently treats tenant_id as optional and lacks
explicit previous_state/new_state fields; update status_change.json to make the
application identifier required (mark "tenant_id" as required in the root
"required" array or otherwise add a required "application_id" equivalent), add
"previous_state" and "new_state" properties (type "string", non-nullable) to the
schema, and include those two fields in the schema's "required" array so every
status_change event must carry tenant_id plus previous_state and new_state;
apply the same changes to the other schema blocks noted (lines referenced in the
review).
- Around line 52-55: The schema defines "timestamp_event" as epoch milliseconds
but uses "type": "number" which allows fractions; change the "timestamp_event"
field in the JSON schema to use "type": "integer" (and add "minimum": 0 if you
want to enforce non-negative timestamps) so the schema enforces
whole-millisecond epoch values.

---

Nitpick comments:
In `@tests/unit/handlers/test_handler_topic.py`:
- Line 90: Add a new test function (e.g.,
test_post_status_change_schema_validation) in the existing test_handler_topic
suite that exercises the POST path for the schema named
"public.cps.za.status-change": send one valid POST payload (matching the schema,
e.g., including execution_id as string) and assert the handler accepts it
(status accepted/success), then send an obviously invalid payload (e.g.,
execution_id missing or wrong type) and assert the handler rejects it with a
validation error (400 or rejection response and an error message referencing the
schema/field); place both assertions in the same test to ensure load+validate
behavior is covered end-to-end.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 469ed8af-1aad-4a69-aa28-c2f10a0eb96a

📥 Commits

Reviewing files that changed from the base of the PR and between a0b6f6f and a6dc8b4.

📒 Files selected for processing (7)
  • conf/access.json
  • conf/topic_schemas/status_change.json
  • src/handlers/handler_topic.py
  • src/utils/config_loader.py
  • src/utils/constants.py
  • tests/unit/handlers/test_handler_topic.py
  • tests/unit/utils/test_config_loader.py

Comment thread conf/topic_schemas/status_change.json
Comment thread conf/topic_schemas/status_change.json
kevinwallimann and others added 2 commits May 20, 2026 16:49
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
conf/topic_schemas/status_change.json (1)

34-41: 💤 Low value

Minor: stray leading space in source_app description.

Line 36's description starts with a leading space (" Standardized source application name..."). Trivial cleanup while you're touching the field.

✏️ Proposed tweak
-            "description": " Standardized source application name (aqueduct, unify, lum, etc)"
+            "description": "Standardized source application name (aqueduct, unify, lum, etc)"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@conf/topic_schemas/status_change.json` around lines 34 - 41, The description
value for the JSON schema field "source_app" contains a stray leading space;
update the "source_app" property's "description" (in status_change.json) to
remove the leading whitespace so it reads "Standardized source application name
(aqueduct, unify, lum, etc)" exactly, ensuring the JSON string has no extra
leading character.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@conf/topic_schemas/status_change.json`:
- Around line 34-41: The description value for the JSON schema field
"source_app" contains a stray leading space; update the "source_app" property's
"description" (in status_change.json) to remove the leading whitespace so it
reads "Standardized source application name (aqueduct, unify, lum, etc)"
exactly, ensuring the JSON string has no extra leading character.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 61200d85-a19c-420a-9e0c-38cd27ac8d69

📥 Commits

Reviewing files that changed from the base of the PR and between a6dc8b4 and c6e6750.

📒 Files selected for processing (1)
  • conf/topic_schemas/status_change.json

Copy link
Copy Markdown
Collaborator

@oto-macenauer-absa oto-macenauer-absa left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see couple issue that should be fixed:
postgres writer - this one is not implemented - it requires specific sql defined, could be opted out if sql peristence is not desired but with the current state it will spam "unknow topic"errors
kafka writer - at the moment the key for the message is not used, but with this topic, if we need the ordering, it should use some key

is the ADR going to be part of the commit? There are some inconsistencies, e.g. country_code vs country, incomplete events, also isn't the status_type duplicate with the event_type?

Also I'm not sure EventGate works with the "allOf" conditional validation, this should be tested.

Comment thread src/utils/constants.py Outdated
Comment thread src/utils/constants.py
TOPIC_TEST = "public.cps.za.test"
TOPIC_STATUS_CHANGE = "public.cps.za.status-change"

SUPPORTED_WRITE_TOPICS: frozenset[str] = frozenset({TOPIC_RUNS, TOPIC_DLCHANGE, TOPIC_TEST})
Copy link
Copy Markdown
Collaborator

@oto-macenauer-absa oto-macenauer-absa May 25, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

missing the status_change topic in SUPPORTED_WRITE_TOPICS

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm also there is no addition of this new queue in src/writers/sql/inserts.sql - do we want to push it into our Postgres for analytical purposes or no? It might become quite massive over time though

"description": "Environment (dev, uat, pre-prod, prod, test or others)"
},
"timestamp_event": {
"type": "integer",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The runs schema uses "type": "number" for timestamps. Herei s "integer". While epoch milliseconds are integers, the inconsistency may confuse producers.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, number can also be floating point, so integer is the correct choice here. However, your call, rather be consistent but wrong, or eventually fix it in the runs schema as well?

Comment thread conf/topic_schemas/status_change.json Outdated
"properties": {
"event_type": {
"enum": [
"JobCreatedEvent",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, I like that you thought about it, but aren't half of these already mandatory? These: source_app and source_app_version and environment so to me only the last 2 make sense here unless I misunderstood how it works.


Another thing - maybe some other event types can also require some mandatory attributes?

Like, JobUpdatedEvent might require status_type or status_detail - this is the primary change that the event would emit, right? Otherwise, what's there to update?


Thinking about this a bit more - mandatory parameters:

  • Consider adding job_name and perhaps even definition_id as required on creation events (identity should be established at creation)
  • Consider making status_type required for "JobCreatedAndStartedEvent", "JobStartedEvent", "JobUpdatedEvent"

kevinwallimann and others added 3 commits May 27, 2026 23:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add status_change topic support to EventGate

3 participants